package main

import (
	"context"
	"fmt"
	"time"

	"go.mongodb.org/mongo-driver/bson/primitive"

	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
)

// 任务的执行时间点
type TimePoint struct {
	StartTime int64 `bson:"startTime"`
	EndTime   int64 `bson:"endTime"`
}

// 一条日志
type LogRecord struct {
	// ``是golang的标签语法，序列化与反序列化，``定义导出mongodb的字段名和格式，字段名采用驼峰式命名
	// 想要导出，结构体字段的首字母必须大写
	JobName   string    `bson:"jobName"`   // 任务名
	Command   string    `bson:"command"`   // shell命令
	Err       string    `bson:"err"`       // 脚本错误
	Content   string    `bson:"content"`   // 脚本输出
	TimePoint TimePoint `bson:"timePoint"` // 执行时间点
}

func main() {
	var (
		client     *mongo.Client
		err        error
		opt        *options.ClientOptions
		database   *mongo.Database
		collection *mongo.Collection
		record     *LogRecord
		result     *mongo.InsertOneResult
		docid      primitive.ObjectID
	)

	// 1.建立连接
	opt = options.Client() // 生成一个Clientopt
	opt.ApplyURI("mongodb://127.0.0.1:27017")
	opt.SetConnectTimeout(5 * time.Second)

	if client, err = mongo.Connect(context.TODO(), opt); err != nil {
		fmt.Println(err)
		return
	}

	// 2.选择数据库my_db
	database = client.Database("cron")

	// 3.选择表my_collection
	collection = database.Collection("log")

	// 4.插入记录(bson) - 插入的是BSON(二进制数据)
	record = &LogRecord{
		JobName:   "job10",
		Command:   "echo hello",
		Err:       "",
		Content:   "hello",
		TimePoint: TimePoint{StartTime: time.Now().Unix(), EndTime: time.Now().Unix() + 10},
	}

	// 会自动对里面的数据进行序列化
	if result, err = collection.InsertOne(context.TODO(), record); err != nil {
		fmt.Println(err)
		return
	}

	// _id：默认生成一个全局唯一的ID，ObjectID：12字节的二进制
	// 通过反射，interface{}反解出真实的类型
	docid = result.InsertedID.(primitive.ObjectID) // 返回插入数据后的自增ID
	fmt.Println("自增ID:", docid.Hex())              // 转到16进制
}
